package org.example.rabbitmq.product.config.rabbitmq;

import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author hzq
 * @date 2021/11/24 14:21
 */
@Configuration
public class RabbitmqExchangeConfiguration {

    /**
     * 它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。
     */
    @Bean
    public DirectExchange directExchange() {
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("alternate-exchange", "fanout.mode");// 备份交换器
        return new DirectExchange("direct.mode", true, false, arguments);
    }

    /**
     * 它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中，即无视RoutingKey和BindingKey的匹配规则。
     */
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout.mode");
    }

    /**
     * 上面讲到direct类型的交换器路由规则是必须完全匹配BindingKey和RoutingKey，但这种严格的匹配方式在很多情况下无法满足实际业务的需求。
     * topic类型的交换器在 匹配规则上进行了扩展，它与direct类型的交换器类似，也是将消息路由到BindingKey和RoutingKey相匹配的队列中，但匹配规则略有不同，约定如下：
     * 1.RoutingKey为一个点号“.”分隔的字符串，被“.”号分隔的每一段独立的字符串称为一个单词，如“com.rabbitmq.client”等。
     * 2.BindingKey和RoutingKey一样也是“,”分隔的字符串。
     * 3.BindingKey中存在两种特殊字符串“”和“#”，用于做模糊匹配，其中“”用于匹配一个单词，“#”用于匹配多个单词（可以是零个）。
     */
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange("topic.mode");
    }

    /**
     * 自定义
     */
//    @Bean
//    public CustomExchange delayExchange() {
//        Map<String, Object> args = new HashMap<>();
//        args.put("x-delayed-type", "direct");
//        args.put("x-delayed-type", "topic");
//        return new CustomExchange("delay.mode", "x-delayed-message", true, false, args);
//    }

}
